<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>执行上下文</title>
    <script>
        /**
         * 1.代码位置
         *      全局代码
         *      函数代码（局部代码）
         *      
         * 全局执行上下文是在全局作用域确定之后，js代码马上执行之前创建
         * 函数执行上下文是在调用函数时，函数代码执行之前创建
         * 
         * 2.全局执行上下文
         *      将执行全局代码前，会将window作为全局执行上下文，对全局数据进行预处理
         *      用var 定义的全局变量添加为window的属性，全局函数添加为window的方法,然后将this赋值为window，然后才执行全局代码
         */
        console.log(c, window.c)
        console.log(this)
        var c = 200

        /**
         * 3.函数执行上下文（虚拟的对象，调用时产生，只有函数内可见，函数执行后销毁）
         * 在调用函数，准备执行函数体之前，创建对应的函数执行上下文对象
         * 对局部数据进行预处理：
         * 1.将形参变量进行赋值，并添加为函数执行上下文的属性
         * 2.arguments被赋值，添加为函数执行上下文的属性
         * 3.var定义的局部变量赋值为undefined ，加入函数执行上下文属性，方法添加进执行上下文方法
         * 4.this赋值为当前调用者
         * 预处理完成，执行函数体代码
         * 
         * @param a1
         */
        function fun(a1) {
            console.log(a1) //100
            console.log(a2) // undefined
            console.log(a3) // a3(){}
            a3() // a2()
            console.log(this) //window
            console.log(arguments) //伪数组100 200
            
            var a2 = 0;
            
            function a3() {
                console.log('a2()')
            }
        }
        
        fun(100, 200)
    </script>
</head>
<body>

</body>
</html>
